#include<bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
const int N=1e5+10;
#define INF 0x3f3f3f3f;
typedef long long int ll;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
//----------------------------------------------------------------------------//
int n,m,d;
int p[N],a[N],pos[N];
void solve()
{
	cin>>n>>m>>d;//n是p长度,m是a长度,d是d
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];
		pos[p[i]]=i;
	}

	for(int i=1;i<=m;i++) cin>>a[i];//映射下标从1开始,通过大小找p数组下标

	int ans=INF;
	for(int i=1;i<m;i++)//相邻两个数才考虑交换
	{
		if(pos[a[i]]>pos[a[i+1]]||pos[a[i+1]]>pos[a[i]]+d) ans=0;
		else//两种移动,一个是移动左边,一个是移刚好离d的右边
		{
			if(d+1<n) ans=min(ans,pos[a[i]]+d+1-pos[a[i+1]]);//这是加和不是下标越界,且两个下标都可以动通过d+1来算出距离及相差的移动距离
			//d+1小于n的极端情况就是让pos[a[i]]在最左边+d后还能余下一个位置放pos[a[i+1]]
			ans=min(ans,pos[a[i+1]]-pos[a[i]]);
		}
	} 
	cout<<ans<<'\n';
	
}

int main()
{
	close();
	int T; cin>>T;
	while (T--) solve();
	return 0;
}